package xf.app1;

import javax.servlet.ServletException;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Enumeration;
import java.lang.String;

public class MyServlet1 extends HttpServlet {

    // 通过继承 HttpServlet 定义了  一个自定义的 HttpServlet类。 类中有 方法。
    //  如和调用这些方法  用自定义类的对象 调用。   那么 这个自定义类的对象是如何产生的 。
    // 是 tomcat服务器 通过 反射机制，动态创建的。 因为是通过反射创建的，tomcat就一定要知道 自定义类的类名
    // 在配置文件web.xml 中 ，给当前类设置权限类定名 。然后再给该类 设置别名。
    // 当浏览器发出请求时 ，就是访问这个servlet，tomcat根据别名用反射创建 这个 servlet类的对象 从而调用 方法。结束。

    // service方法  是 servlet对象 的 入口方法。即 servlet对象处理请求时 都要先执行 service方法
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        // post请求    请求体中 会有 请求参数  要设置字符集
        req.setCharacterEncoding("utf-8");


        System.out.println("service 方法起点啦 ");
        if (req.getMethod().equals("GET")) {
            this.doGet(req, resp);
        } else if (req.getMethod().equals("POST")) {
            this.doPost(req, resp);
        }
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("post 请求进来了");


        // 1  请求行内容的获取
        //请求方式
        String method = req.getMethod();

        //url uri 网站的路径
        String url = req.getRequestURL().toString();
        String uri = req.getRequestURI();

        // http版本
        String protocol = req.getProtocol();

        System.out.println("请求行内容如下：");
        System.out.println("method = " + method);
        System.out.println("uri = " + uri);
        System.out.println("url = " + url);
        System.out.println("protocol = " + protocol);

        //2 请求头的内容
        System.out.println("请求头内容如下：");
        // 获取请求头里面 所有 键值对的 key
        Enumeration<String> headerNames = req.getHeaderNames();
        while (headerNames.hasMoreElements()) {
            String key = headerNames.nextElement();
            // 在根据key获取值
            String headerValue = req.getHeader(key);
            //输出
            System.out.println(key+":"+headerValue);
        }

/*

        //3  获取请求体中的 请求参数的值。 只有method = post 时  请求体中才有 请求参数内容
        System.out.println("请求体内容如下：");
        //   用输入流 来读取
        ServletInputStream inputStream = req.getInputStream();
        int i =0;
        byte[] bytes = new byte[1024];
        while ((i=inputStream.read(bytes))!=-1) {
            String s= new String(bytes,0,i);
            String[] split = s.split("&");
            for (String ss:split) {
                System.out.println("ss = " + ss);
            }
        }
        inputStream.close();
*/
         // 注意： 获取请求的参数 只能获取一遍。 第二遍就是获取空值。
        System.out.println("请求参数通用方法获取");
        // 根据请求参数的name 获取请求参数 的value
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        System.out.println("username = " + username);
        System.out.println("password = " + password);
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("我是get请求....");

        //请求的 内容 获取
        /**
         请求行（请求方式（GET/POST） 请求资源（URI） http协议版本（http1.1））
         request.getMethod()
         请求头（键值对形式存在。 host、user-agent、referer）
         request.getHeader("name")
         request.getHeaderNames()
         一个空行
         实体内容（POST提交的参数）
         request.getInputStream()

         获取请求参数数据：(GET或POST)
         request.getParameter("name")  一个值的参数
         request.getParameterValues("name"); 多个值的参数
         request.getParameterNames()    所有参数

         */
        String method = req.getMethod();
        System.out.println("method = " + method);

        System.out.println("===================================================");

        Enumeration<String> headerNames = req.getHeaderNames();
        while (headerNames.hasMoreElements()) {
            String s = headerNames.nextElement();
            System.out.println(req.getHeader(s));
        }

        System.out.println("===================================================");

        ServletInputStream inputStream = req.getInputStream();
       /* int i = 0;
        while ((i=inputStream.read())!=-1){
            System.out.println("i = " + i);
        }*/
       int i = 0;
       byte[] bytes = new byte[1024];
        while ((i=inputStream.read(bytes))!=-1) {
            System.out.println(new String(bytes,0,i));
        }
        inputStream.close();

        System.out.println(" ========================================= ");

        Enumeration<String> parameterNames = req.getParameterNames();
        while (parameterNames.hasMoreElements()) {
            String ps = parameterNames.nextElement();
            System.out.println("ps = " + ps);
        }

    }
}
